Technical Note TN1164
Native Scripting Additions

ñ⁄éü

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇ≈ÇÕÅAMac OS 8.6 Ç≈ì±ì¸Ç≥ÇÍÇΩ AppleScript ÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉÅÉJÉjÉYÉÄÇΔÅAMac OS X ópÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇçÏê¨Ç∑ÇÈÇΩÇflÇÃägí£ API DžǬǢǃê‡ñæÇµÇ‹Ç∑ÅB

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇäJî≠Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÉfÉxÉçÉbÉpå¸ÇØÇ…èëÇ©ÇÍǃǢNjÇ∑ÅB

[2004 îN 4 åé 8 ì˙]






ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇΔÇÕâΩÇ©?

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ AppleScript åæåÍÇÃç\ï∂Çägí£Ç∑ÇÈÉÅÉJÉjÉYÉÄÇíÒãüǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ Apple ÉCÉxÉìÉgÇèàóùÇ∑ÇÈLJÇÃÇΔÅAApple ÉCÉxÉìÉgÉfÅ[É^Çà coercion ÇçsǧLJÇÃÇ…ï™ófiÇ≈Ç´Ç‹Ç∑ÅBApple ÉCÉxÉìÉgÇèàóùÇ∑ÇÈÉ^ÉCÉvÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égÇÌÇÍǃǢÇÈ Apple ÉCÉxÉìÉgÉnÉìÉhÉâÇΔìØÇ∂óvóÃÇ≈é¿ëïǵNjÇ∑Ç™ÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕì¡éÍÇ»é¿çsä¬ã´Ç…íuÇ©ÇÍǃǢÇÈÇÃÇ≈ÅAApple ÉCÉxÉìÉgÉnÉìÉhÉâÇ‚ä¬ã´ïœêîÇê≥ǵÇ≠àµÇ§ÇΩÇflÇ…ÇÕÅAÇ≥ÇÁÇ…éüÇÃÉãÅ[É`ÉìÇé¿ëïÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

  • ÉCÉxÉìÉgÉnÉìÉhÉâÇ‚ coercion ÉnÉìÉhÉâÉCÉìÉXÉgÅ[ÉãÅAÉÅÉÇÉäÇÃämï€ÅAÉOÉçÅ[ÉoÉãïœêîÇÃèÄîıǻǫÅAé¿çsÇ…ïKóvÇ»èâä˙âªçÏãΔ

  • ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£ÉçÅ[ÉhÅ^ÉAÉìÉçÅ[ÉhÇÃÉ^ÉCÉ~ÉìÉOÇåàíËÇ∑ÇÈÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉgÇÃìOíÍ

  • äeéÌÉnÉìÉhÉâÇÃçÌèúÅAçÏãΔóÃàÊÇÃâèúǻǫÇÃèIóπçÏãΔ

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç…ÇÊǡǃÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍÇÈ Apple ÉCÉxÉìÉgÉnÉìÉhÉâÇΔ Apple ÉCÉxÉìÉgÉfÅ[É^ coercion ÉnÉìÉhÉâÇÕÅAàÍî ìIÇ…ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égÇÌÇÍÇÈÉnÉìÉhÉâÇΔìØÇ∂ï˚ñ@Ç≈é¿ëïǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇΔÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃà·Ç¢ÇÕÅAÉRÅ[ÉhÇÃÉpÉbÉPÅ[ÉWÇ≥ÇÍǃǢÇÈï˚ñ@ÇΔÅAé¿çsï˚ñ@Ç≈Ç∑ÅBDZÇÍÇ©ÇÁÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉpÉbÉPÅ[ÉWÇΔé¿çsï˚ñ@DžǬǢǃè⁄ǵÇ≠ê‡ñæÇµÇ‹Ç∑ÅB



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉpÉbÉPÅ[ÉWâª

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ 2 í ÇËÇÃÉpÉbÉPÅ[ÉWÇ™ë∂ç›ÇµÇ‹Ç∑ÅB

  1. Mach-O å`éÆÇà Mac OS X ÉoÉìÉhÉã

    Mach-O å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ Mac OS X ÉoÉìÉhÉãÇΔǵǃÉpÉbÉPÅ[ÉWâªÇµÇ‹Ç∑ÅBMach-O å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅA(a) ÉoÉìÉhÉãÇà CFBundleSignature Ç™ osax Ç≈džÇÈÇ©ÅA(b) ÉoÉìÉhÉãñºÇÃägí£éqÇ™ .osax ÇÃÅAÇ¢Ç∏ÇÍÇ©ÇÃï˚ñ@Ç≈ì¡íËÇ≥ÇÍÇ‹Ç∑ÅB

  2. CFM å`éÆÇà CarbonLib Ç®ÇÊÇ— InterfaceLib Ç…ÉäÉìÉNÇ≥ÇÍÇΩÉVÉìÉOÉãÉoÉCÉiÉä

    CarbonLib Ç…ÉäÉìÉNÇ≥ÇÍÇΩÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃǛǙMac OS XÇ≈égópÇ≈Ç´Ç‹Ç∑ÅBCFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇΔÉNÉäÉGÅ[É^ÉRÅ[ÉhÇ≈ì¡íËÇ≥ÇÍÇ‹Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇ™ osaxÅAÉNÉäÉGÅ[É^ÉRÅ[ÉhÇÕîƒópìIÇ»íl (ascr) Ç‹ÇΩÇÕ BNDL ÉäÉ\Å[ÉXÇ≈íËã`Ç≥ÇÍǃǢÇÈílÇ≈džǡǃLJǩNjǢNjÇπÇÒÅB

    íçà”ÅF
    InterfaceLib Ç…ÉäÉìÉNÇ≥ÇÍÇΩÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ Mac OS X Ç≈égópÇ≈Ç´Ç‹ÇπÇÒÅBCarbonLib Ç…ÉäÉìÉNÇ≥ÇÍÇΩÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ Mac OS 9 Ç≈à¿ëSÇ…égópÇ≈Ç´Ç‹ÇπÇÒÅB



êÊì™Ç…ñflÇÈ



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âª

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇ≈ÇÕÅAïKóvÇ»ÉnÉìÉhÉâÇÃÉCÉìÉXÉgÅ[ÉãÅAÉÅÉÇÉäÇÃämï€ÅAǪÇÃëºÇÃèÄîıèàóùÇçsǢNjÇ∑ÅBèâä˙âªÉãÅ[É`ÉìÇÕà»â∫ÇÃÇÊǧDžç\ê¨ÇµÇ‹Ç∑ÅB

  1. GestaltÅAsysctl ǻǫÇégǡǃÅAé¿çsÇ…ïKóvÇ»ÉVÉXÉeÉÄÉäÉ\Å[ÉXÇÃë∂ç›ÇämîFǵNjÇ∑ÅBDZDZÇ≈ÇÕÉÅÉÇÉäÇÃämï€Ç‚é¿çsÇ…ïKóvÇ»ÉtÉ@ÉCÉãÇÃämîFLJçsǢNjÇ∑ÅB

  2. Apple ÉCÉxÉìÉgÉnÉìÉhÉâÇ‚ coercion ÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉnÉìÉhÉâÇÕÉVÉXÉeÉÄÉfÉBÉXÉpÉbÉ`ÉeÅ[ÉuÉãÇ…ÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉäÉXÉg 1 Ç≈ÇÕÉVÉXÉeÉÄÉfÉBÉXÉpÉbÉ`ÉeÅ[ÉuÉãÇ…ÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈï˚ñ@Çè–âÓǵǃǢNjÇ∑ÅB

    ÉäÉXÉg 1 ÉVÉXÉeÉÄÉfÉBÉXÉpÉbÉ`ÉeÅ[ÉuÉãÇ…ÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈ

         Boolean isSysHandler = true;
    
         anErr = AEInstallEventHandler( theAEEventClass, theAEEventID,
                                 theHandlerUPP, refcon, isSysHandler);
    
         anErr = AEInstallCoercionHandler( fromType, toType, theHandlerUPP,
                                 refcon, fromTypeIsDesc, isSysHandler);
    
    


    èdóvÅF
    èâä˙âªÉãÅ[É`ÉìÇ™ noErr à»äOÇÃåãâ Çï‘ǵÇΩèÍçáÅAèIóπä÷êîÇÕåƒÇ—èoÇ≥ÇÍǻǢÇΩÇflÅAèâä˙âªä÷êîÇ™é¿çsǵÇΩèàóùÇÃÉNÉäÅ[ÉìÉAÉbÉvÇÕèâä˙âªä÷êîÇ™çsǧïKóvǙdžÇËÇ‹Ç∑ÅBì¡Ç…ÅAApple ÉCÉxÉìÉgÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãǵÇΩNjNjécǵǃǮǢǃÇÕÇ»ÇËÇ‹ÇπÇÒÅB



  3. íËêîÇÃèâä˙âªÇ‚èâä˙âªÉãÅ[É`ÉìÉpÉâÉÅÅ[É^ÇÃï€ë∂ǻǫÅAǪÇÃëºÇÃèâä˙ê›íËÇçsǢNjÇ∑ÅB

  4. èâä˙âªÇ…é∏îsǵÇΩèÍçáÅAèâä˙âªÉãÅ[É`ÉìÇ≈é¿çsǵÇΩèàóùÇÃénññÇçsÇ¢ÅAìKêÿÇ»ÉGÉâÅ[ÉRÅ[ÉhÇï‘ǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃëºÇÃÉãÅ[É`ÉìÇÕåƒÇ—èoÇ≥ÇÍÇ‹ÇπÇÒÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇÕÉpÉbÉPÅ[ÉWï˚ñ@Ç…ÇÊǡǃÅAé¿ëïï˚ñ@Ç™àŸÇ»ÇËÇ‹Ç∑ÅBCFM å`éÆÇÃèÍçáÅACode Fragment ÇÃèâä˙âªÉãÅ[É`ÉìÇ™égópÇ≥ÇÍÇ‹Ç∑ÅBàÍï˚ÅAMach-O å`éÆÇÃèÍçáÅASAInitialize ÇΔǢǧÉãÅ[É`ÉìÇíËã`ǵǃÉGÉNÉXÉ|Å[ÉgÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

CFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèÍçáÇÕÅACode Fragment ÇÃèâä˙âªÉãÅ[É`ÉìÇ™åƒÇŒÇÍÇ‹Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAèâä˙âªÉãÅ[É`Éìà»äOÇÃÇΔDZÇÎÇ≈é©ï™ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠DZÇΔǙdžÇÍÇŒÅAèâä˙âªÉãÅ[É`Éìì‡Ç≈éÊìæÇµÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ÷ÇÃéQèΔÇÉOÉçÅ[ÉoÉãïœêîǻǫDžï€ë∂ǵNjÇ∑ÅBÉäÉXÉg 2 ÇÕ CFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇÃó·Ç≈Ç∑ÅB



ÉäÉXÉg 2 CFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`Éì

OSErr CFMSAInitialize(InitBlockPtr initBlkPtr) {
    OSErr err;

    ...DZDZÇ≈èâä˙âªÇçsǧ...

    return err;
}



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇ…ìnÇ≥ÇÍÇÈ initBlkPtr ÉpÉâÉÅÅ[É^ÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈÇΩÇflÇÃèÓïÒÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBèâä˙âªÉãÅ[É`Éìà»äOÇÃÉnÉìÉhÉâÇ≈é©ï™ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠èÍçáÇÕÅAéQèΔèÓïÒÇÉOÉçÅ[ÉoÉãïœêîǻǫDžï€ë∂ǵǃǮǴNjÇ∑ÅBÉäÉXÉg 3 Ç≈ÇÕÉGÉCÉäÉAÉXÇÉOÉçÅ[ÉoÉãïœêîÇ…ï€ë∂ǵǃǢNjÇ∑ÅB



ÉäÉXÉg 3 CFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`Éì

static AliasHandle gMyAdditionLocation;

OSErr CFMSAInitialize(InitBlockPtr initBlkPtr) {
    OSErr err;

        /* DZÇÃÉãÅ[É`Éìà»äOÇÃÇΔDZÇÎÇ≈é©ï™ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
        DZÇΔǙdžÇÍÇŒÅAÉOÉçÅ[ÉoÉãïœêîÇ…ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡
        ÉtÉ@ÉCÉãÇ÷ÇÃéQèΔÇï€ë∂ǵNjÇ∑ÅB*/

    err = NewAlias(NULL, initBlkPtr->fragLocator.u.onDisk.fileSpec,
                   &gMyAdditionLocation);
    if (err == noErr) ...

    return err;
}



Mach-O å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ SAInitialize ÇΔåæÇ§ä÷êîÇÉGÉLÉXÉ|Å[ÉgÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÃä÷êîÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡èâä˙âªéûÇ…åƒÇŒÇÍÇ‹Ç∑ÅBÉäÉXÉg 4 Ç≈ÇÕ Mach-O ÇÃèâä˙âªä÷êîÇÃàÍó·Çé¶ÇµÇ‹Ç∑ÅB



ÉäÉXÉg 4 Mach-O å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªä÷êî

OSErr SAInitialize(CFBundleRef additionBundle) {
    OSErr err;

    ...DZDZÇ≈èâä˙âªÇçsǧ...

    return err;
}



SAInitialize Çà additionBundle ÉpÉâÉÅÅ[É^ÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉoÉìÉhÉãÇéwǵNjÇ∑ÅBDZÇÃílÇégǡǃÅAÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃílÇÉOÉçÅ[ÉoÉãïœêîǻǫDžï€ë∂Ç∑ÇÍÇŒÅAèâä˙âªéûà»äOÇÃÉnÉìÉhÉâÇ≈ÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBadditionBundle ÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉçÅ[ÉhÇ≥ÇÍǃǢÇÈä‘óLå¯Ç≈Ç∑ÇÃÇ≈ÅACFRetain ÇåƒÇ—èoÇ∑ïKóvÇÕdžÇËÇ‹ÇπÇÒÅB

CFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèÍçáÅACode Fragment ÇÃèâä˙âªÉãÅ[É`ÉìÇÃñºëOÇéwíËÇ∑ÇÈï˚ñ@ÇÕäJî≠ä¬ã´Ç…àÀë∂ǵNjÇ∑ÇÃÇ≈ÅAäJî≠ä¬ã´ÇÃê‡ñæèëÇÇ®ì«Ç›Ç≠ÇæÇ≥Ç¢ÅBCode Fragment ManagerÅACFM ÇÃèâä˙âªÉãÅ[É`ÉìÅAMach-O DžǬǢǃÇÕDZÇÃå„ÇÃéQçlï∂å£ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

êÊì™Ç…ñflÇÈ



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπ

èIóπÉãÅ[É`ÉìÇ≈ÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇèIóπÇ≥ÇπÇÈÇΩÇflÇ…ïKóvÇ»èàóùÇçsǢNjÇ∑ÅBì¡Ç…ÅAéüÇÃèàóùÇåáÇ©Ç≥Ç∏Ç…çsǧïKóvǙdžÇËÇ‹Ç∑ÅB

  • èâä˙âªÉãÅ[É`ÉìÇ≈ÉCÉìÉXÉgÅ[ÉãǵÇΩÉCÉxÉìÉgÉnÉìÉhÉâÇ‚ coercion ÉnÉìÉhÉâÇçÌèúÇ∑ÇÈ

  • ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç≈äÑÇËìñǃÇΩÉÅÉÇÉäÇ‚ÉäÉ\Å[ÉXÇâèúÇ∑ÇÈ

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇÕÅAAppleScript Ç™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇΔÇÃê⁄ë±ÇÉNÉçÅ[ÉYÇ∑ÇÈÇΔÇ´Ç…åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃÇÊǧǻê⁄ë±ÇÃÉNÉçÅ[ÉYÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉtÉHÉãÉ_Ç©ÇÁäOÇ≥ÇÍÇΩå„ÅAAppleScript Ç™éüÇ…èâä˙âªÇ≥ÇÍÇΩÉ^ÉCÉ~ÉìÉOÇ≈Ç∑ÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉçÅ[ÉhÇ‚ÉAÉìÉçÅ[ÉhÇÕ gdut ÉCÉxÉìÉgÇ™éÛóùÇ≥ÇÍÇΩÉ^ÉCÉ~ÉìÉOÇ≈çsÇÌÇÍÇ‹Ç∑ÅBAppleScript ÇÕÉRÉìÉ|Å[ÉlÉìÉgÇ÷ÇÃê⁄ë±Ç™äJÇ¢ÇΩå„ÅAÉXÉNÉäÉvÉgÇÉRÉìÉpÉCÉãÇ∑ÇÈëOÇ…ÉçÅ[ÉhÇ‚ÉAÉìÉçÅ[ÉhÇçsǢNjÇ∑ÅB

Mac OS 9 Ç≈ÇÕÅAÉçÅ[ÉhÇΔÉAÉìÉçÅ[ÉhÇÕǪÇÃÇΔÇ´Ç…ÇæÇØçsÇÌÇÍÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèIóπéûÇ‚ÉVÉXÉeÉÄÇÃèIóπéûÇ≈LJÅAã@î\í«â¡ÇÃÉçÅ[ÉhfiÇΔÉAÉìÉçÅ[ÉhÇÕçsÇÌÇÍÇ‹ÇπÇÒÅBDZÇÃÇΩÇflèIóπä÷êîÇ™åƒÇ—èoÇ≥ÇÍÇÈÇÃÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉtÉHÉãÉ_Ç©ÇÁçÌèúÇ≥ÇÍÇΩå„ÅAéüÇà gdut ÉCÉxÉìÉgÇÃÇΔÇ´Ç…Ç»ÇËÇ‹Ç∑ÅB

Mac OS X Ç≈ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìèIóπéûDžLJÉAÉìÉçÅ[ÉhÇ™çsÇÌÇÍÇ‹Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉAÉìÉçÅ[ÉhÇÕÅAã@î\í«â¡ÇÉçÅ[ÉhǵÇΩÉvÉçÉZÉXÇ≤ÇΔÇ…ï ÅXÇ…çsǧïKóvǙdžÇÈÇΩÇflÅAã@î\í«â¡ÇäÆëSÇ…çÌèúÇ∑ÇÈÇ…ÇÕÅAÉtÉHÉãÉ_Ç©ÇÁçÌèúǵÇΩå„ÅAï°êîÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ… gdut ÉCÉxÉìÉgÇëóêMÇµÇ»ÇØÇÍnjǻÇÁǻǢDZÇΔLJdžÇËÇ‹Ç∑ÅBMac OS 9 Ç≈ÇÕÅAÇ«ÇÍÇ© 1 ǬÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ… gdut ÉCÉxÉìÉgÇëóêMÇ∑ÇÈDZÇΔÇ≈çÌèúÇ≥ÇÍÇ‹Ç∑ÅB

ÉäÉXÉg 5 ÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇÃàÍó·Ç≈Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ CFM å`éÆÇÃÉoÉCÉiÉäÇΔǵǃíÒãüÇ≥ÇÍǃǢÇÈèÍçáÇÕÅACFM ÇÃèIóπÉãÅ[É`ÉìÇÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇ…ê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBMach-O å`éÆÇÃÉoÉCÉiÉäÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ïsóvDžǻǡÇΩÇÁÅAAppleScript Ç…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇΩ SATerminate ÇÉGÉNÉXÉ|Å[ÉgǵNjÇ∑ÅB



ÉäÉXÉg 5 ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇÃó·

void SATerminate(void) {

    AERemoveEventHandler(theAEEventClass,
                                 theAEEventID, gTheHandler, true);

    DisposeAEEventHandlerUPP(gTheHandler);

    ...ǪÇÃëºÇÃèIóπçÏãΔ...

}



CFM å`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèÍçáÅAèIóπÉãÅ[É`ÉìÇÃê›íËï˚ñ@ÇÕäJî≠ä¬ã´Ç…ÇÊǡǃàŸÇ»ÇËÇ‹Ç∑ÇÃÇ≈ÅAè⁄ǵÇ≠ÇÕäJî≠ä¬ã´ÇÃê‡ñæèëÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBCFM ÉRÅ[ÉhÅACFM ÇÃèâä˙âªÉãÅ[É`ÉìÅAÉoÉìÉhÉãéQèΔÅAMach-O ÇÃÉoÉìÉhÉãå`éÆÇ…ǬǢǃÇÕÅADZÇÃãLéñÇÃç≈å„ÇÃéQçlï∂å£ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB



ÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉg

AppleScript Ç™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÉAÉìÉçÅ[ÉhÇ∑ÇÈç€ÅAÇ‹Ç∏ÅAǪÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç…ñ‚Ç¢çáÇÌÇπÇǵǃÅAÇ‹Çæé¿çsíÜÇÃã@î\í«â¡Ç÷ÇÃåƒÇ—èoǵǙdžÇÈǩǫǧǩÇí≤Ç◊Ç‹Ç∑ÅBdžÇÈèÍçáÇÕÅAã@î\í«â¡ÇÃÉAÉìÉçÅ[ÉhÇÕà¿ëSÇ≈ÇÕǻǢÇΩÇflÅAÉAÉìÉçÅ[ÉhÇÕéÊÇËè¡Ç≥ÇÍÇÈÇ©ÅAåƒÇ—èoǵǙäÆóπÇ∑ÇÈÇ‹Ç≈âÑä˙Ç≥ÇÍÇ‹Ç∑ÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAåªç›ÇÃé¿çsèÛãµÇÅAéüÇÃÇ«ÇøÇÁÇ©ÇÃï˚ñ@Ç≈ AppleScript Ç…ì`ǶNjÇ∑ÅBCFM ÉxÅ[ÉXÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAgAdditionReferenceCount ÇΔǢǧñºëOÇÃÉOÉçÅ[ÉoÉãïœêîéQèΔÇÉGÉNÉXÉ|Å[ÉgǵNjÇ∑ÅBMach-O ÉxÅ[ÉXÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅASAIsBusy ÇΔǢǧñºëOÇÃÉãÅ[É`ÉìÇÉGÉNÉXÉ|Å[ÉgǵNjÇ∑ÅBCFM ã@î\í«â¡Ç…ÇÊǡǃÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍÇÈ gAdditionReferenceCount ÇÃílÇÕÅAÉäÉXÉg 6 Ç…é¶Ç∑ SAIsBusy ÉãÅ[É`ÉìÇÃó·Ç≈égÇÌÇÍǃǢÇÈÇÃÇΔìØÇ∂ï˚ñ@Ç≈ AppleScript Ç…ÇÊǡǃégÇÌÇÍÇ‹Ç∑ÅBäÓñ{ìIÇ…ÇÕÅAgAdditionReferenceCount Ç™É[Éçà»äOÇÃèÍçáÅAǪÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕâΩÇÁÇ©ÇÃåƒÇ—èoǵÇäÆóπÇ∑ÇÈÉvÉçÉZÉXDždžÇÈÇΔå©Ç»Ç≥ÇÍÅAÉAÉìÉçÅ[ÉhÇ≥ÇÍÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅB



ÉäÉXÉg 6 ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Çà SAIsBusy ÉãÅ[É`ÉìÇÃó·

UInt32  gAdditionReferenceCount = 0;

Boolean SAIsBusy(void) {

    return (gAdditionReferenceCount != 0);

}



Ç∑Ç◊ǃÇà Apple ÉCÉxÉìÉgÉnÉìÉhÉâÇΔ Apple ÉCÉxÉìÉgÉfÅ[É^ coercion ÉnÉìÉhÉâÇÃì‡ë§Ç≈ÇÕÅAé¿çséûÇ… gAdditionReferenceCount Ç 1 ǬëùǂǵÅAÉnÉìÉhÉâÇ™ñflÇÈíºëOÇ…ílÇ 1 Ǭå∏ÇÁǵNjÇ∑ÅBÉäÉXÉg 7 ÇÕìTå^ìIÇ»ÉnÉìÉhÉâÉãÅ[É`ÉìÇÃé¿ëïó·Ç≈Ç∑ÅB



ÉäÉXÉg 7 gAdditionReferenceCount Çä«óùÇ∑ÇÈìTå^ìIÇ»ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉnÉìÉhÉâÉãÅ[É`Éì

UInt32  gAdditionReferenceCount = 0;

     ....

OSErr MyEventHandler(const AppleEvent *ev,
                     AppleEvent *reply,
                     long refcon) {
    OSErr err;

        /* é¿çséûÇÕÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉgÇëùǂǵNjÇ∑ */

    gAdditionReferenceCount++;

          ...ÉnÉìÉhÉâÇÃé¿ëïÉRÅ[Éh...

        /* èIóπíºëOÇ…ÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉgÇå∏ÇÁǵNjÇ∑ */

    --gAdditionReferenceCount;

    return err;
}



êÊì™Ç…ñflÇÈ



ǪÇÃëº



Mac OS X ÇÃé¿çsä¬ã´

Mac OS X ÇÃé¿çsä¬ã´ÇÃèÍçáÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ AppleScript Ç…ê⁄ë±ÇµÇƒÇ¢ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≤ÇΔÇ…ÅAï ÅXÇ…ÉçÅ[ÉhÇ≥ÇÍÇ‹Ç∑ÅBåãâ ÇΔǵǃÅAàÍìxÇ…àŸÇ»ÇÈï°êîÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìDžǮǢǃÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃëΩÇ≠ÇÃÉCÉìÉXÉ^ÉìÉXÇ™äJÇ¢ÇΩèÛë‘DžǻǡǃǢÇÈDZÇΔÇîOì™Ç…íuǴǻǙÇÁÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Çê›åvÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBåãâ ÇΔǵǃÅAÉvÉäÉìÉ^Ç‚ÉVÉäÉAÉãÉ|Å[ÉgǻǫÇà 1 ǬÇÃÉäÉ\Å[ÉXÇã§óLÇ∑ÇÈÇÊǧDžê›åvÇ≥ÇÍǃǢÇÈèÍçáÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ä‘Ç…ÇÕí«â¡ÇÃÉRÅ[ÉhÇ™ëÂó Ç…ïKóvÇ…Ç»ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅB



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉoÉìÉhÉãÉäÉ\Å[ÉXÇÃéÊìæï˚ñ@

Mach-O ÉoÉìÉhÉãå`éÆÇ≈èëÇ©ÇÍǃǢÇÈÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ‚ÉtÉ@ÉCÉãÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBDZÇÃèÍçáÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅASAInitialize Ç…ìnÇ≥ÇÍÇΩ CFBundleRef ÇÃÉRÉsÅ[ÇÉLÉÉÉbÉVÉÖÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB



CFBundleRef gMyAdditionBundle;

OSErr SAInitialize(CFBundleRef additionBundle) {

        /* ÉnÉìÉhÉâì‡Ç≈ÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈèÍçáÇÕ
        DZDZÇ≈ÉoÉìÉhÉãÇ÷ÇÃÉäÉtÉ@ÉåÉìÉXÇï€ë∂ǵNjÇ∑ */

    gMyAdditionBundle = additionBundle;

    ....



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç≈ÇÕÅAìnÇ≥ÇÍÇΩÉoÉìÉhÉãéQèΔÇ…ëŒÇµÇƒ CFRetain ÇåƒÇ—èoÇ∑ïKóvÇÕdžÇËÇ‹ÇπÇÒÅBÉoÉìÉhÉãéQèΔÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£Ç™äJǢǃǢÇÈå¿ÇËÅiSATerminate Ç™åƒÇ—èoÇ≥ÇÍÇÈÇ‹Ç≈ÅjóLå¯Ç≈Ç∑ÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ÷ÇÃÉAÉNÉZÉXï˚ñ@DžǬǢǃÇÕÅADZÇÃãLéñÇÃç≈å„ÇÃéQçlï∂å£ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÃéÊìæï˚ñ@

íPàÍÇÃÉtÉ@ÉCÉã CFM ÉoÉCÉiÉäÇΔǵǃíÒãüÇ≥ÇÍǃǢÇÈÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAǪÇÃÉnÉìÉhÉâÇà 1 ǬÇé¿çsǵǃǢÇÈä‘Ç…ÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇ÷ÇÃÉAÉNÉZÉXÇ™ïKóvÇΔÇ»ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBDZÇÍÇçsǧÇΩÇflÇ…ÅAÉfÉBÉXÉNè„ÇÃÉtÉ@ÉCÉãà íuÇÃéQèΔÇÅAǪÇÃèâä˙âªÉãÅ[É`Éìì‡Ç…ï€ë∂ǵǃǮÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅBå„Ç≈ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™Ç±ÇÃÉtÉ@ÉCÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈïKóvÇ™ê∂Ç∂ÇÈÇΔÅADZÇÃéQèΔÇégǡǃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ´ÅAïKóvÇ»ÉfÅ[É^ÇéÊÇËèoÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

Code Fragment Manager ÇÕÅADZÇÃèâä˙âªÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ëOÇ…ÅAèâä˙âªÉãÅ[É`ÉìÇ…ìnÇ≥ÇÍÇΩ CFragInitBlock ì‡ÇÃÉtÉ@ÉCÉãéwíËÉåÉRÅ[ÉhÅiFSSpecÅjÇ÷ÇÃÉ|ÉCÉìÉ^Çê›íËǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅADZÇÃílÇå„Ç≈égópÇ∑ÇÈÇΩÇflÇ…ÉOÉçÅ[ÉoÉãïœêîÇ…ÉLÉÉÉbÉVÉÖǵǃǮÇ≠DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB



AliasHandle gMyAdditionLocation;

OSErr ConnectionInitializationRoutine(InitBlockPtr initBlkPtr) {
    OSErr err;

        /* å„íˆÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇïKóvÇΔÇ∑ÇÈ 
        èÍçáÇÕDZDZÇ≈ÉtÉ@ÉCÉãÇà FSSpec ÇÉOÉçÅ[ÉoÉãïœêîÇ…ï€ë∂ǵNjÇ∑ÅB*/
        
    err = NewAlias(NULL,
                   initBlkPtr->fragLocator.u.onDisk.fileSpec,
                   &gMyAdditionLocation);
    if (err == noErr) {



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉnÉìÉhÉâì‡Ç≈äJÇ¢ÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÕÅAÉnÉìÉhÉâèIóπéûÇ‹Ç≈Ç…ÉNÉçÅ[ÉYÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÇ‹ÇΩÅAÉnÉìÉhÉâì‡Ç≈ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇäJÇ≠èÍçáÅAÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇïœçXǵǻǢÇÊǧǻçHïvÇ™ïKóvÇ≈Ç∑ÅBà»â∫ÇÃó·Ç≈ÇÕÅAÉnÉìÉhÉâì‡Ç≈ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇäJÇ´ÅAÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇÃèÛë‘Çï€ë∂ǵǃǢNjÇ∑ÅB



     SInt16    oldResFile;
     SInt16    osaxResRef;
     FSRef     ref;

     oldResFile = CurResFile();
     osaxResRef = FSOpenResFile( &ref, fsRdPerm );

     // DZDZÇ≈ÉäÉ\Å[ÉXÇÃì«Ç›çûǛǻǫÇÃèàóùÇçsǧ

     CloseResFile( osaxResRef );
     UseResFile( oldResFile );


íçà”ÅF
ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇì¡íËÇ∑ÇÈÇΩÇflÇÃÉtÉ@ÉCÉãéQèΔî‘çÜÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇ≈éÊìæÇµÇ‹Ç∑ÅB



ÉçÅ[ÉJÉãÉVÉXÉeÉÄÇΔÉäÉÇÅ[ÉgÉVÉXÉeÉÄÇ©ÇÁÇÃÉCÉxÉìÉg

ÉäÉÇÅ[ÉgÉVÉXÉeÉÄÇ©ÇÁÇÃÉCÉxÉìÉgÇåüèoǵǃãëî€Ç∑ÇÈǩǫǧǩÇÕǪÇÍǺÇÍÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉnÉìÉhÉâÇ™åàíËǵNjÇ∑ÅBÉnÉìÉhÉâÇÕÅAéÛêMǵÇΩÉCÉxÉìÉgÇ…ä‹Ç‹ÇÍÇÈ keyEventSourceAttr ëÆê´ÇÉ`ÉFÉbÉNǵǃÅAǪÇÃÉCÉxÉìÉgÇÃÉ\Å[ÉXÇîªífÇ≈Ç´Ç‹Ç∑ÅBÉäÉÇÅ[ÉgÉVÉXÉeÉÄÇ©ÇÁÇÃÉCÉxÉìÉgÇÕÅAkAERemoteProcess ÇΔǢǧëÆê´ílÇéùÇøÇ‹Ç∑ÅB



     DescType   sourceAttr;
     DescType   actualType;
     Size       actualSize;

     anErr = AEGetAttributePtr( eventPtr, keyEventSourceAttr, typeType,
                                &actualType, &sourceAttr,
                                sizeof( sourceAttr ), &actualSize);

     if ( sourceAttr == kAERemoteProcess ) {

          return errAEEventNotHandled;

     }
     

êÊì™Ç…ñflÇÈ



éQçlï∂å£



êÊì™Ç…ñflÇÈ

ïœçXóöó

2003 îN 4 åé 16 ì˙

ÉTÉìÉvÉãÉRÅ[ÉhÇÉ_ÉEÉìÉçÅ[Éh

êÊì™Ç…ñflÇÈ

É_ÉEÉìÉçÅ[Éh

Bluebook

Xcode ÉvÉçÉWÉFÉNÉgÇ…égópÇ∑ÇÈÅAÉXÉPÉãÉgÉìÉXÉNÉäÉvÉeÉBÉìÉOí«â¡ÉRÅ[Éh (7K)

É_ÉEÉìÉçÅ[Éh


êÊì™Ç…ñflÇÈ